// =============================================
// Shader 名称：Fractal/Fractal Surface GPU
// 用途：用于渲染分形结构中的各个部件（比如通过 GPU Instancing 批量绘制的几何体）
// 类型：基于 Surface Shader（表面着色器），支持 GPU Instancing 与程序化配置
// =============================================

Shader "Fractal/Fractal Surface GPU" {

    // -------------------------------
    // 【Properties】属性块：暴露给材质面板可调节的参数
    // -------------------------------
    Properties {
        // 基础颜色：一个 RGBA 颜色值，默认为白色
        _BaseColor ("Base Color", Color) = (1.0, 1.0, 1.0, 1.0)

        // 表面光滑度：控制 PBR 材质的光滑程度，范围 0~1，用于 Standard 光照模型
        _Smoothness ("Smoothness", Range(0,1)) = 0.5
    }

    SubShader {

        CGPROGRAM

        // 指定使用 Surface Shader 的标准光照模型：Standard（PBR）
        // fullforwardshadows：支持完整的前向渲染阴影
        // addshadow：为该物体生成额外的阴影投射 Pass
        #pragma surface ConfigureSurface Standard fullforwardshadows addshadow

        // 启用 GPU Instancing 支持，并指定一个自定义的“程序化配置函数”
        // assumeuniformscaling：假定所有实例具有统一的缩放（优化）
        // procedural:ConfigureProcedural：告诉 Unity 使用名为 ConfigureProcedural 的函数来进行程序化设置（比如传入变换矩阵）
        #pragma instancing_options assumeuniformscaling procedural:ConfigureProcedural

        // 允许在编辑器中修改 Shader 代码后自动重新编译（开发阶段方便调试）
        #pragma editor_sync_compilation

        // 指定该 Shader 最低支持的 Shader Model 版本（4.5 支持 ComputeBuffer、GPU Instancing 等高级特性）
        #pragma target 4.5

        // 引入自定义的 HLSL 文件，其中可能包含：矩阵处理、Instancing 数据读取、顶点变换等逻辑
        // 这个文件通常由开发者自己编写，用于扩展 Surface Shader 的功能
        #include "FractalGPU.hlsl"

        // -------------------------------
        // 【Input 结构体】：定义从顶点着色器传递给表面函数的输入数据
        // -------------------------------
        struct Input {
            // 世界空间中的位置信息，可能用于后续光照、颜色变化等计算
            float3 worldPos;
        };

        // -------------------------------
        // 【材质属性变量】：从 Material 中暴露的属性，映射到 Shader 内部使用
        // -------------------------------
        float4 _BaseColor;    // 基础颜色（RGBA）
        float _Smoothness;    // 表面光滑度参数 [0 ~ 1]

        // -------------------------------
        // 【表面着色函数】：定义材质的外观（颜色、光滑度、法线等）
        // -------------------------------
        void ConfigureSurface (Input input, inout SurfaceOutputStandard surface) {
            // 设置材质的基础颜色（漫反射颜色 Albedo），使用 _BaseColor 的 RGB 部分
            surface.Albedo = _BaseColor.rgb;

            // 设置材质的光滑度（影响高光反射模糊程度），使用 _Smoothness 参数
            surface.Smoothness = _Smoothness;
        }

        ENDCG
    }

    FallBack "Diffuse"
}